/**
 * 拦截器，这里可以配置你所需要的改变的数据
 * config: 一些基础配置
 * request：请求拦截器
 * response：响应拦截器 == > 可根据状态码进行操作
 * install 布尔值 设置是否需要合并 config 数据
 */

import ENV_config from "../config/index.js";
import {
  notNeedToken
} from "../config/api.config";
import {
  Token
} from "../utils/constant";
import {
  getStorageItem
} from "../utils/storage.js";

class HttpInterceptor {
  constructor() {
    this.config = {
      baseUrl: ENV_config.baseUrl, // 请求的本域名
      method: "POST",
      // 设置为json，返回后会对数据进行一次JSON.parse()
      dataType: "json",
      showLoading: true, // 是否显示请求中的loading
      loadingText: "请求中...", // 请求loading中的文字提示
      loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
      originalData: false, // 是否在拦截器中返回服务端的原始数据
      loadingMask: true, // 展示loading的时候，是否给一个透明的蒙层，防止触摸穿透
      // 配置请求头信息
      header: {
        "content-type": "application/json;charset=UTF-8",
      },
    };
    // 请求拦截部分，如配置，每次请求前都会执行
    this.request = (config) => {
      console.log("http.interceptor--进入请求拦截器", config);
      // 引用token
      // 如果token放在了Storage本地存储中，拦截是每次请求都执行的
      // 所以哪怕您重新登录修改了Storage，下一次的请求将会是最新值
      if (!notNeedToken.includes(config.url)) {
        console.log("需要token---");
        const token = getStorageItem(Token);
        // config.header.token = token;

        config.header["app-authc"] = token;
      }

      // 如果token放在了globalData，通过getApp().globalData获取
      // config.header.token = getApp().globalData.username;

      // 某些情况下需要设置请求头 "content-type"
      if (config.data && config.data["content-type"]) {
        config.header["content-type"] = config.data["content-type"];
        delete config.data["content-type"];
      }

      // 可以对某个url进行特别处理
      // if (config.url == "/user/login") config.header.noToken = true;
      // 最后需要将config进行return

      return config;
      // 如果return一个false值，则会取消本次请求
      // if(config.url == '/user/rest') return false; // 取消某次请求
    };

    // 响应拦截，如配置，每次请求结束都会执行本方法
    this.response = (res) => {
      console.log("http.interceptor--进入响应拦截器", res);
      if (res.code == 200 || res.code === 0) {
        wx.$u.toast('请求成功！');
        return res.data; // 根据后台返回的数据来修改
      } else if (res.code == 201) {
        // 假设201为token失效，这里跳转登录
        wx.$u.toast("验证失败，请重新登录");
        setTimeout(() => {
          wx.$u.router(wx.$rConfig.login);
        }, 1500);
        return false;
      } else {
        // 如果返回false，则会调用Promise的reject回调，
        // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
        return false;
      }
    };

    // 设置是否需要合并 config 数据
    this.install = true;
  }
}

export default new HttpInterceptor();